package br.com.hmm.mb;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.component.UIData;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.model.SelectItem;

import org.richfaces.component.html.HtmlTabPanel;

import br.com.hmm.businesslogic.ContaService;
import br.com.hmm.businesslogic.SocioService;
import br.com.hmm.businesslogic.TransacoesService;
import br.com.hmm.dao.TransacoesDAO;
import br.com.hmm.entidade.Conta;
import br.com.hmm.entidade.Socio;

public class ManterContaBean extends GenericoBean {

	private Conta conta;
	
	private Conta contaSelecionada;
	
	private List<Conta> listaContas;
	
	private UIData tblConta;
	
	private double dadosConta = 0;
	
	List<Socio> listSociosConta;
	
	private int mes;
	
	private List<SelectItem> meses = new ArrayList<SelectItem>();
	
	private HtmlTabPanel tabConta;
	
	private int numSocios;
	
	List<Map> pagamentosFazer;
	
	List<Map> lancamentosFuturos;
	
	
	
	public int getNumSocios() {
		return numSocios;
	}


	public void setNumSocios(int numSocios) {
		this.numSocios = numSocios;
	}


	public ManterContaBean(){
		conta = new Conta();
		this.mes = 0;
	}


	public Conta getConta() {
		return conta;
	}


	public void setConta(Conta conta) {
		this.conta = conta;
	}
	
	
	public Conta getContaSelecionada() {
		return contaSelecionada;
	}


	public void setContaSelecionada(Conta contaSelecionada) {
		this.contaSelecionada = contaSelecionada;
	}


	public List<Conta> getListaContas() {
		return listaContas;
	}


	public void setListaContas(List<Conta> listaContas) {
		this.listaContas = listaContas;
	}


	public UIData getTblConta() {
		return tblConta;
	}


	public void setTblConta(UIData tblConta) {
		this.tblConta = tblConta;
	}



	public List<Socio> getListSociosConta() {
		return listSociosConta;
	}


	public void setListSociosConta(List<Socio> listSociosConta) {
		this.listSociosConta = listSociosConta;
	}


	public double getDadosConta() {
		return dadosConta;
	}


	public void setDadosConta(double dadosConta) {
		this.dadosConta = dadosConta;
	}


	public List<SelectItem> getMeses() {
		return meses;
	}


	public void setMeses(List<SelectItem> meses) {
		this.meses = meses;
	}


	public int getMes() {
		return mes;
	}


	public void setMes(int mes) {
		this.mes = mes;
	}


	public HtmlTabPanel getTabConta() {
		return tabConta;
	}


	public void setTabConta(HtmlTabPanel tabConta) {
		this.tabConta = tabConta;
	}


	public List<Map> getPagamentosFazer() {
		return pagamentosFazer;
	}


	public void setPagamentosFazer(List<Map> pagamentosFazer) {
		this.pagamentosFazer = pagamentosFazer;
	}


	public List<Map> getLancamentosFuturos() {
		return lancamentosFuturos;
	}


	public void setLancamentosFuturos(List<Map> lancamentosFuturos) {
		this.lancamentosFuturos = lancamentosFuturos;
	}


	public String gravar(){
		try{
			if(ContaService.inserir(conta) == true){
				atualizarLista();
				adicionarMensagem("Conta criada com sucesso.");
			}
		}catch (Exception e) {
			adicionarMensagemErro("Erro ao inserir: "  + e.getLocalizedMessage());
		}
		return "";
	}
	
	
	public String atualizar(){
		try{
			if(ContaService.update(contaSelecionada) == true){
				setPagamentosFazer(TransacoesService.getPagamentosFazer(contaSelecionada.getId()));
				setLancamentosFuturos(TransacoesService.getLancamentosFuturos(contaSelecionada.getId()));
				adicionarMensagem("Conta alterada com sucesso.");
			}
		}catch (Exception e) {
			adicionarMensagemErro(e.getLocalizedMessage());
		}
		return novaConta();
	}
	
	
	public String findAll(){
		try{
			setListaContas(ContaService.list());
		}catch (Exception e) {
			adicionarMensagemErro("Nenhuma conta encontrada." + e.getLocalizedMessage());
		}
		return "";
	}
	
	
	public void atualizarLista(){
		conta = new Conta();
		findAll();
	}
	
	
	public String novaConta(){
		this.conta = new Conta();
		this.contaSelecionada = new Conta();
		this.listSociosConta = new ArrayList<Socio>();
		findAll();
		return "goConta";
	}
	
	
	public String edicaoConta(){
		try{
			contaSelecionada = (Conta) tblConta.getRowData();
			return "goContaEdicao";
		}catch (Exception e) {
			adicionarMensagemErro(e.getLocalizedMessage());
		}
		return "";
	}
	
	
	public String delete(){
		try{
			contaSelecionada = (Conta) tblConta.getRowData();
			if(ContaService.delete(contaSelecionada) == true){
				listaContas.remove(tblConta.getRowIndex());
				adicionarMensagem("Conta removida com sucesso.");
			}else{
				adicionarMensagemErro("Não foi possível remover esta conta.");
			}
		}catch (Exception e) {
			adicionarMensagemErro(e.getLocalizedMessage());
		}
		return "";
	}
	
	
	public String exibirDetalhes(){
		try{			
			contaSelecionada = (Conta) tblConta.getRowData();
			try{
				contaSelecionada.setListaTransacoes(TransacoesService.getTransacoesByConta(contaSelecionada));
			}catch (NullPointerException e) {
				
			}			
			dadosConta = ContaService.getSaldo(contaSelecionada.getId());
			contaSelecionada.setSaldo(dadosConta);		
			listarSociosConta();
			setNumSocios(listSociosConta.size());
			try{
				setPagamentosFazer(TransacoesService.getPagamentosFazer(contaSelecionada.getId()));
			}catch(NullPointerException e){
				
			}
			try{
				setLancamentosFuturos(TransacoesService.getLancamentosFuturos(contaSelecionada.getId()));
			}catch(NullPointerException e){
				
			}
			preencheMeses();
			tabConta.setSelectedTab("tab1");
		}catch (Exception e) {
			//adicionarMensagemErro("Não foi possível exibir os detalhes desta conta. " + e.getLocalizedMessage() );
			
		}
		
		return "goDetalhesConta";
	}
	
	
	public void listarSociosConta(){	
		try{
			setListSociosConta(SocioService.listarSociosConta(contaSelecionada.getId()));
		}catch (Exception e) {
			System.out.println(e.getLocalizedMessage());
		}
	}
		
		
	public String listarTransacoesMes(){
		try{
			try{
				contaSelecionada.setListaTransacoes(TransacoesService.filtrarTransacoesPorMes(contaSelecionada.getId(), getMes()));
			}catch(NullPointerException exp){
				adicionarMensagemErro(exp.getLocalizedMessage());
			}
			
		}catch (Exception e) {
			adicionarMensagemErro("Não foi possível listar por esse mês. " + e.getLocalizedMessage() );
			try {
				contaSelecionada.setListaTransacoes(TransacoesService.getTransacoesByConta(contaSelecionada));
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		
		return "";
	}
			
	public List<SelectItem> preencheMeses(){
		if(meses.isEmpty()){
		
		meses.add(new SelectItem(1,"Janeiro"));
		meses.add(new SelectItem(2,"Fevereiro"));
		meses.add(new SelectItem(3,"Março"));
		meses.add(new SelectItem(4,"Abril"));
		meses.add(new SelectItem(5,"Maio"));
		meses.add(new SelectItem(6,"Junho"));
		meses.add(new SelectItem(7,"Julho"));
		meses.add(new SelectItem(8,"Agosto"));
		meses.add(new SelectItem(9,"Setembo"));
		meses.add(new SelectItem(10,"Outubro"));
		meses.add(new SelectItem(11,"Novembro"));
		meses.add(new SelectItem(12,"Dezembro"));
		return meses;
	}
		return null;
	}
	
	public String consultaTransacoes(){
		try{
			preencheMeses();	
			tabConta.setSelectedTab("tab2");
			//contaSelecionada.setListaTransacoes(TransacoesService.getTransacoesByConta(contaSelecionada));
		}catch (NullPointerException e) {
			
		} catch (Exception e) {
			adicionarMensagemErro("Não foi possível listar. " + e.getLocalizedMessage());
			
		}	
		return "";
	}
}
